#include <cstdio>
#include <cstdlib>
#include <cstring>

#include "DesJoueurs.H"
#include "Case.H"
#include "Joueur.H"
#include "Partie.H"
#include "Plateau.H"
#include "CaisseAPoint.H"
#include "CarteQuestion.H"


#include <unistd.h>


void initPartie(Partie & p)
{
    int nbj, sf;
    char nb[256];
    printf("Entrez le nombre de joueurs (de 2 a 4): \n");
    scanf("%s", nb);
    while (strcmp(nb, "2") != 0 &&
    strcmp(nb, "3") != 0 &&
    strcmp(nb, "4") != 0)
    {
        printf("Erreur de saisie, veuillez recommencer \n");
        printf("Entrez le nombre de joueurs (de 2 a 4): \n");
        scanf("%s", nb);
    }
    nbj=atoi(nb);
    char score[256];
    printf("Entrez le score (compris entre 10 et 40): \n");
    scanf("%s", score);
    while (strcmp(score, "10") != 0 &&
    strcmp(score, "11") != 0 &&
    strcmp(score, "12") != 0 &&
    strcmp(score, "13") != 0 &&
    strcmp(score, "14") != 0 &&
    strcmp(score, "15") != 0 &&
    strcmp(score, "16") != 0 &&
    strcmp(score, "17") != 0 &&
    strcmp(score, "18") != 0 &&
    strcmp(score, "19") != 0 &&
    strcmp(score, "20") != 0 &&
    strcmp(score, "21") != 0 &&
    strcmp(score, "22") != 0 &&
    strcmp(score, "23") != 0 &&
    strcmp(score, "24") != 0 &&
    strcmp(score, "25") != 0 &&
    strcmp(score, "26") != 0 &&
    strcmp(score, "27") != 0 &&
    strcmp(score, "28") != 0 &&
    strcmp(score, "29") != 0 &&
    strcmp(score, "30") != 0 &&
    strcmp(score, "31") != 0 &&
    strcmp(score, "32") != 0 &&
    strcmp(score, "33") != 0 &&
    strcmp(score, "34") != 0 &&
    strcmp(score, "35") != 0 &&
    strcmp(score, "36") != 0 &&
    strcmp(score, "37") != 0 &&
    strcmp(score, "38") != 0 &&
    strcmp(score, "39") != 0 &&
    strcmp(score, "40") != 0)
    {
        printf("Erreur de saisie, veuillez recommencer \n");
        printf("Entrez le score (compris entre 10 et 40): \n");
        scanf("%s", score);
    }
    sf=atoi(score);
    p.NbJoueur=nbj;
    p.ScoreFinal=sf;
    initDesJoueurs(p.DJ,nbj);
    initCaisseAPoint(p.CAP);
    initPlateau();
    p.tabQuestions[0]=initCarteQuestionBio();
    p.tabQuestions[1]=initCarteQuestionMaths();
    p.tabQuestions[2]=initCarteQuestionInfo();
    p.tabQuestions[3]=initCarteQuestionCG();
}




int nbJoueursPartie(Partie & p)
{
    return p.NbJoueur;
}


int scoreFinalPartie(Partie & p)
{
    return p.ScoreFinal;
}

DesJoueurs DesJoueursPartie(Partie & p)
{
    return p.DJ;
}


CaisseAPoint CaisseAPointPartie(Partie & p)
{
    return p.CAP;
}

CarteQuestion renvoieCarteQuestionPartie(Partie & p,int matiere, int nb_alea)
{
    return p.tabQuestions[matiere][nb_alea];
}

void deroulementCoupPartie(Partie & p, Joueur & j)
{
    char* nom=nomJoueur(j);
    int score=scoreJoueur(j);
    DesJoueurs dj=DesJoueursPartie(p);
    int nbJoueurs=nbJoueursPartie(p);

    printf("%s, a votre tour \n",nom);
    printf("Votre score actuel: %d \n",score);
    system("PAUSE");
    //sleep(1);

    int nbCartePST=nbCartePasseSonTourJoueur(j);
    if(nbCartePST>0)
    {
        printf("Vous devez passer votre tour \n");
        decrementeNbCartePasseSonTourJoueur(j);
        score=scoreJoueur(j);
        printf("Votre score apres ce coup: %d \n\n",score);
    }
    else
    {
        int compteurGuillet=compteurGuilletJoueur(j);
        if(compteurGuillet>0)
        {
            bool g=actionCaseGuillet(j);
            if(g==true)
            {
                int pos=positionJoueur(j);
                Case c=casePlateau(pos);
                actionCase(p.tabQuestions,c,j,dj,p.CAP,nbJoueurs);
            }
            score=scoreJoueur(j);
            printf("Votre score apres ce coup: %d \n\n",score);
        }
        else
        {
            deplaceJoueur(j);
            int pos=positionJoueur(j);
            Case c=casePlateau(pos);
            actionCase(p.tabQuestions,c,j,dj,p.CAP,nbJoueurs);
            score=scoreJoueur(j);
            printf("Votre score apres ce coup: %d \n\n",score);
        }
    }
//    sleep(4);
}



static bool deroulementPartieBis(Partie & p, int k)
{

    int nbJoueurs=nbJoueursPartie(p);
    int scorePartie=scoreFinalPartie(p);
    for(int i=0; i<nbJoueurs; i++)
    {
        Joueur j= joueurNumPassageDesJoueurs(p.DJ, i);
        int score=scoreJoueur(j);
        if(score>=scorePartie)
        {
            char* nomGagnant=nomJoueur(j);
            printf("La partie est terminee, le gagnant est: %s \n",nomGagnant);
            finPartie(p,j);
            system("PAUSE");
//            sleep(5);
            exit(1);
        }
    }
    Joueur& j= joueurNumPassageDesJoueurs(p.DJ, k);
    deroulementCoupPartie(p,j);
    deroulementPartieBis(p,(k+1)%nbJoueurs);
    return false;
}

void deroulementPartie(Partie & p)
{
    bool b= deroulementPartieBis(p,0);
    if (b==false)
    {
        printf("Gros probleme de chargement de la partie, veuillez consulter le vendeur...");
    }
}


void finPartie(Partie & p, Joueur & j)
{
    eliminationDesJoueurs(p.DJ);
    delete [] p.tabQuestions[0];
    delete [] p.tabQuestions[1];
    delete [] p.tabQuestions[2];
    delete [] p.tabQuestions[3];
}
